package jdbc;

// 测试JDBC

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;

public class JdbcInsert {
    // 通过jdbc操作数据库
    // 往testbit数据库的students(name,age)数据表中插入一条记录

    public static void main(String[] args) throws SQLException {
        // 1. 创建数据源对象（数据库是啥以及位置）
        DataSource dataSource = new MysqlDataSource();
        // 向下转型：只出现一次，耦合性较低
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/testbit?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("Xianmeng");
        // 记住用户名！以及密码

        // 2. 代码和数据库连接
        Connection connection = dataSource.getConnection();
        System.out.println(connection);

        // 【通过用户输入进行插入值】
        Scanner in = new Scanner(System.in);
        System.out.println("请输入姓名：");
        String name = in.nextLine();
        System.out.println("请输入年龄：");
        int age = in.nextInt();

        // 3. 构造要执行的sql语句
        // 一定要使用英文版
        //String sql = "insert into students values('刘思思',18)";  // 注意双引号里面使用单引号，不使用双引号

        // 传入手动输入的值
        //String sql = "insert into students values('" + name + "'," + age + ")";
        // 注意都有双引号， String类型还有单引号

        // 内部拼装机制:? 其实是占位符，后面会进行替换
        String sql = "insert into students values(?,?)";

        // 传入SQL语句,构造 PreparedStatement 预处理语句
        PreparedStatement statement = connection.prepareStatement(sql);

        // 内部拼接要有这个 下标从1开始！！1就是第一个?   2就是第二个?
        statement.setString(1,name);
        statement.setInt(2,age);
        System.out.println("statement:" + statement);

        // 4. 执行sql
        // 执行方法有两个：executeUpdate对应插入、删除、修改语句 ——返回一个int,也就是受影响的行数
        // executeQuery对应查询
        int n = statement.executeUpdate();
        System.out.println("受影响条数n="+ n);

        // 5. 完成，关闭释放相关资源
        statement.close();
        connection.close();

        // 成功！
    }
}
